package org.wuhong.utils;


import com.alibaba.fastjson.JSONObject;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.wuhong.entity.Accounts;
import lombok.extern.slf4j.Slf4j;

import java.util.Date;

@Slf4j
public class JWTUtil {

    //设置密钥
    private static final String  KEY = "1357k1k";
    //签名
    private static final String SIGN="wuhong";
    //设置过期时间
    private static final long EXPIRE= 60*60*1000*24;

    //创建token字符串
    public static String createToken(Accounts user){
        //指定算法
        Algorithm algorithm = Algorithm.HMAC256(KEY);
        //指定获取token的时间
        Date date = new Date();
        //指定过期的时间（加上过期的时间时长）
        Date expireDate = new Date(date.getTime()+EXPIRE);
        //获取token
        String token = JWT.create().
                withIssuer(SIGN).//添加签名
                withIssuedAt(date).//添加生成时间
                withExpiresAt(expireDate).//添加过期时间
                withClaim("account", JSONObject.toJSONString(user)).//添加附加信息

                sign(algorithm);//使用算法生成加密token

        return token;
    }

    //验证token
    public static boolean checkToken(String token){
        /**
         * 验证token信息
         * 1.创建加密算法 - algorithm
         * 2.生成验证其 - jwtVerifier
         * 3.使用验证器验证token - jwtVerifier.verify(token);
         * 4.验证错误的话，方法会直接报异常，此处使用try-catch，报异常说明token信息错误，以此返回false
         *
         */

        try {
            Algorithm algorithm = Algorithm.HMAC256(KEY);
            JWTVerifier jwtVerifier = JWT.require(algorithm).withIssuer(SIGN).build();
            jwtVerifier.verify(token);
            return true;
        }catch (Exception e){
            log.error("token已过期，请重新获取");
            return false;
        }
    }

    //获取token信息
    public static Accounts getTokenInfo(String token){
        Accounts user = new Accounts();
        String account = JWT.decode(token).getClaim("account").asString();
        Accounts accounts = JSONObject.parseObject(account, Accounts.class);

//        user.setAccount(JWT.decode(token).getClaim("account").asString());
//        user.setId(JWT.decode(token).getClaim("id").asString());

        return  accounts;
    }

    public static boolean isExpire(String token){
        Date nowDate = new Date();//获取当前时间
        Date expiresDate = JWT.decode(token).getExpiresAt();//获取过期时间
        return nowDate.after(expiresDate);//现在的时间在过期时间之后则返回false,在过期时间之内则返回true
    }

}
